﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Libreria.SICOM.Negocio;
using Libreria.SICOM.Modelo;
using System.Configuration;
using Web.SICOM.Models;

namespace Web.SICOM.Controllers
{
    public class VariableController : Controller
    {
        //
        // GET: /Variable/

        public ActionResult Index()
        {
            if (Session["Autenticado"] != "True")
            {
                return RedirectToAction("Index", "Inicio");
            }
            VariableModelo modelo = new VariableModelo();

            VariableNegocio varbo=new VariableNegocio();
            UnidaddeMedidaNegocio unibo = new UnidaddeMedidaNegocio();

            modelo.variables = varbo.consultarVariables(ConfigurationManager.ConnectionStrings["SICOM"].ConnectionString);
            modelo.unidades =  unibo.consultarUnidadesdeMedida(ConfigurationManager.ConnectionStrings["SICOM"].ConnectionString);

            ViewData.Model = modelo;

            if (((VariableModelo)ViewData.Model).variables.Count == 0)
            {
                if (((VariableModelo)ViewData.Model).unidades.Count == 0)
                {
                    ViewData.Model = "No Hay Datos de unidades de medida Asociados";
                }
                ViewData.Model = "No Hay Datos de variables Asociados";
            }
            return View();
        }


        public ActionResult Crear()
        {
            if (Session["Autenticado"] != "True")
            {
                return RedirectToAction("Index", "Inicio");
            }
            string cdc = ConfigurationManager.ConnectionStrings["SICOM"].ConnectionString;
            VariableModelo modelo = new VariableModelo();
            modelo.unidades = new UnidaddeMedidaNegocio().consultarUnidadesdeMedida(cdc);


            List<TipodeMuestra> tiposdemuestratemp = new TipodeMuestraNegocio().consultarTiposdeMuestra(cdc);
            List<SelectListItem> tiposdemuestra = new List<SelectListItem>();

            foreach (TipodeMuestra tipodemuestra in tiposdemuestratemp)
            {
                tiposdemuestra.Add(new SelectListItem() { Selected = false, Text = tipodemuestra.Nombre, Value = tipodemuestra.Identificador.ToString() });

            }
            modelo.Tiposdemuestra = tiposdemuestra;
            ViewData.Model = modelo;
            if (((VariableModelo)ViewData.Model).unidades.Count == 0)
            {
                ViewData.Model = "No Hay Datos de unidades de medida Asociados";
            }
            if (((VariableModelo)ViewData.Model).Tiposdemuestra.Count == 0)
            {
                ViewData.Model = "No Hay Datos de Tipos de muestra Asociados";
            }

            return View();
        }


        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult Insertar(Variable variable, string[] TiposdeMuestra)
        {
            String cdc = ConfigurationManager.ConnectionStrings["SICOM"].ConnectionString;
           List<Variable> variablebo = new VariableNegocio().consultarVariables(cdc);
            for (int i = 0; i <= variablebo.Count - 1; i++)
            {
                if (variablebo[i].Identificador == variable.Identificador)
                {
                    ModelState.AddModelError("Identificador", "***El Codigo especificado ya se encuentra en uso***");
                }
                if (variablebo[i].Nombre == variable.Nombre)
                {
                    ModelState.AddModelError("Nombre", "***El Nombre especificado ya se encuentra en uso***");
                }
            }
            if (variable.Unidad == 0)
            {
                ModelState.AddModelError("Unidad", "***La unidad de medida no ha sido especificada***");
            }
            if (TiposdeMuestra ==null || TiposdeMuestra.Contains(""))
            {
                ModelState.AddModelError("Variable", "***Especificacion de tipo(s) de muestra obligatoria***");
            }

            if (!ModelState.IsValid)
            {
                VariableModelo modelo = new VariableModelo();
                modelo.unidades = new UnidaddeMedidaNegocio().consultarUnidadesdeMedida(cdc);
                List<TipodeMuestra> tiposdemuestratemp = new TipodeMuestraNegocio().consultarTiposdeMuestra(cdc);
                List<SelectListItem> tiposdemuestra = new List<SelectListItem>();

                foreach (TipodeMuestra tipodemuestra in tiposdemuestratemp)
                {
                    tiposdemuestra.Add(new SelectListItem() { Selected = false, Text = tipodemuestra.Nombre, Value = tipodemuestra.Identificador.ToString() });

                }
                modelo.Tiposdemuestra = tiposdemuestra;
                ViewData.Model = modelo;
                return View("Crear", ViewData.Model);
            }

            Int32? id = variable.Identificador;
            String name = variable.Nombre;
            Int32? idunidad = variable.Unidad;
            new VariableNegocio().CrearVariable(id, name, idunidad, cdc);
            for (int i = 0; i < TiposdeMuestra.Length; i++)
            {
                new VariableNegocio().CrearVariablePorMuestra(id, Convert.ToInt32(TiposdeMuestra[i]), cdc);
            }
            return RedirectToAction("Index");
        }

        public ActionResult Editar(Int32? id)
        {
            if (Session["Autenticado"] != "True")
            {
                return RedirectToAction("Index", "Inicio");
            }
            string cdc = ConfigurationManager.ConnectionStrings["SICOM"].ConnectionString;
            VariableModelo modelo = new VariableModelo();
            
            modelo.variable = new VariableNegocio().ConsultarPorIdentificador(id, cdc);
            modelo.unidades = new UnidaddeMedidaNegocio().consultarUnidadesdeMedida(cdc);
            //llenado de  tipos de muestra por  variable
            List<TipodeMuestra> tiposdemuestratemp = new VariableNegocio().ConsultarTiposdeMuestraPorVariable(id, cdc);
            List<SelectListItem> tiposdemuestra = new List<SelectListItem>();

            foreach (TipodeMuestra tipodemuestra in tiposdemuestratemp)
            {
                tiposdemuestra.Add(new SelectListItem() { Selected = false, Text = tipodemuestra.Nombre, Value = tipodemuestra.Identificador.ToString() });

            }
            //llenado de  tipos de muestra generales
            List<TipodeMuestra> tiposdemuestraglobales = new TipodeMuestraNegocio().consultarTiposdeMuestra(cdc);
            List<SelectListItem> tiposdemuestragenerales = new List<SelectListItem>();
            foreach (TipodeMuestra tipodemuestrageneral in tiposdemuestraglobales)
            {
                tiposdemuestragenerales.Add(new SelectListItem() { Selected = false, Text = tipodemuestrageneral.Nombre, Value = tipodemuestrageneral.Identificador.ToString() });

            }

            modelo.Tiposdemuestra = tiposdemuestra;
            modelo.Tiposdemuestraglobales = tiposdemuestragenerales;
            ViewData.Model = modelo;

            return View();
        }

        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult Actualizar(Variable variable, string[] TiposdeMuestra)
        {
            Int32? id = variable.Identificador;
            String name = variable.Nombre;
            Int32? idunidad = variable.Unidad;
            String cdc = ConfigurationManager.ConnectionStrings["SICOM"].ConnectionString;
            int count = 0;
            if (TiposdeMuestra ==null || TiposdeMuestra.Contains(""))
            {
                ModelState.AddModelError("Variable", "***Especificacion de tipo(s) de muestra obligatoria***");
            }
            else
            {
                string tipotemporal = TiposdeMuestra[count];
                for (int i = 1; i < TiposdeMuestra.Length; i++)
                {
                    if (TiposdeMuestra[i] == tipotemporal)
                    {
                        ModelState.AddModelError("Variable", "*** Tipo de muestra repetido ***");
                    }
                }
            }
            
            if (!ModelState.IsValid)
            {
                VariableModelo modelo = new VariableModelo();
                modelo.variable = variable;
                modelo.unidades =  new UnidaddeMedidaNegocio().consultarUnidadesdeMedida(cdc);
                //llenado de  tipos de muestra por  variable
                List<TipodeMuestra> tiposdemuestratemp = new VariableNegocio().ConsultarTiposdeMuestraPorVariable(id, cdc);
                List<SelectListItem> tiposdemuestra = new List<SelectListItem>();

                foreach (TipodeMuestra tipodemuestra in tiposdemuestratemp)
                {
                    tiposdemuestra.Add(new SelectListItem() { Selected = false, Text = tipodemuestra.Nombre, Value = tipodemuestra.Identificador.ToString() });

                }
                //llenado de  tipos de muestra generales
                List<TipodeMuestra> tiposdemuestraglobales = new TipodeMuestraNegocio().consultarTiposdeMuestra(cdc);
                List<SelectListItem> tiposdemuestragenerales = new List<SelectListItem>();
                foreach (TipodeMuestra tipodemuestrageneral in tiposdemuestraglobales)
                {
                    tiposdemuestragenerales.Add(new SelectListItem() { Selected = false, Text = tipodemuestrageneral.Nombre, Value = tipodemuestrageneral.Identificador.ToString() });

                }

                modelo.Tiposdemuestra = tiposdemuestra;
                modelo.Tiposdemuestraglobales = tiposdemuestragenerales;
                ViewData.Model = modelo;
                return View("Editar", ViewData.Model);
            }
           // List<TipodeMuestra> tiposmuestraporvariablre =new VariableNegocio().ConsultarTiposdeMuestraPorVariable(id, cdc);

           new VariableNegocio().eliminarTiposdeMuestraPorVariable(id,cdc);
           for (int i = 0; i < TiposdeMuestra.Length; i++)
           {
               new VariableNegocio().CrearVariablePorMuestra(id, Convert.ToInt32(TiposdeMuestra[i]), cdc);
           }

            new VariableNegocio().ActualizarVariable(id, name, idunidad, cdc);
            return RedirectToAction("Index");
        }


        public ActionResult Eliminar(Variable variables)
        {
            if (Session["Autenticado"] != "True")
            {
                return RedirectToAction("Index", "Inicio");
            }

            Int32? id = variables.Identificador;
            String cdc = ConfigurationManager.ConnectionStrings["SICOM"].ConnectionString;
            List<Muestra> listademuestra = new List<Muestra>();
            Muestra muestra = new Muestra(cdc);
            muestra.Identificador = null;
            muestra.Idtipodemuestra = null;
            muestra.Iddeproyecto = null;
            muestra.Iddelugar = null;
            muestra.Fechadecaptura  = DateTime.MinValue;
            muestra.Codigoderesponsable = null;
            muestra.Mac = null;
            muestra.Iddeequipo = null;
            muestra.Iddevariable = id;
            muestra.Valor = null;
            listademuestra = muestra.consultar();

            List<RangodeCualidad> listaderango = new List<RangodeCualidad>();
            RangodeCualidad rango = new RangodeCualidad(cdc);
            rango.Identificador = null;
            rango.Iddevariable = id;
            rango.Valor = null;
            listaderango = rango.consultar();

            if (listademuestra.Count == 0 && listaderango.Count == 0)
            {
                new VariableNegocio().eliminarTiposdeMuestraPorVariable(id, cdc);
                new VariableNegocio().eliminarvariable(id,null,null,cdc);
                new RangodeCualidadNegocio().eliminarRangodeCualidad(id, null, null, cdc);
                return RedirectToAction("Index");
            }

            ModelState.AddModelError("Identificador", "***No se puede eliminar la Variable especificada, se encuentra en uso***");
            VariableModelo modelo = new VariableModelo();

            VariableNegocio varbo = new VariableNegocio();
            UnidaddeMedidaNegocio unibo = new UnidaddeMedidaNegocio();

            modelo.variables = varbo.consultarVariables(ConfigurationManager.ConnectionStrings["SICOM"].ConnectionString);
            modelo.unidades = unibo.consultarUnidadesdeMedida(ConfigurationManager.ConnectionStrings["SICOM"].ConnectionString);

            ViewData.Model = modelo;
            return View("Index", ViewData.Model);
        }



    }
}
